package open.intellijboy.core.configuration.satoken;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * sa-token 配置类
 *
 * @author System
 * @version 1.0.0
 * @since 2024-01-01
 */
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {


    /**
     * 服务器属性配置，用于获取 context-path
     */
    private final ServerProperties serverProperties;

    /**
     * 构造函数注入 ServerProperties
     *
     * @param serverProperties 服务器属性配置
     */
    public SaTokenConfig(ServerProperties serverProperties) {
        this.serverProperties = serverProperties;
    }

    /**
     * 注册 sa-token 拦截器，打开注解式鉴权功能
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 获取 context-path，如果为空则使用空字符串
        String contextPath = serverProperties.getServlet().getContextPath();
        if (contextPath == null || contextPath.isEmpty() || "/".equals(contextPath)) {
            contextPath = "";
        }

        // 确保 contextPath 以 / 结尾，用于路径拼接
        String pathPrefix = contextPath.isEmpty() ? "" : contextPath;

        // 注册 sa-token 拦截器，校验规则为 StpUtil.checkLogin() 登录校验。
        registry.addInterceptor(new SaInterceptor(handle -> {
            // 指定拦截的路径
            SaRouter.match("/**")
                    // 排除的路径（公开接口）
                    .notMatch( "/users/register/**")
                    .notMatch( "/users/login/**")
                    .notMatch( "/users/captcha/**")
                    // 排除 Swagger 相关路径（考虑 context-path）
                    .notMatch(pathPrefix + "/swagger-ui/**")
                    .notMatch(pathPrefix + "/swagger-ui.html")
                    .notMatch(pathPrefix + "/v3/api-docs/**")
                    .notMatch(pathPrefix + "/swagger-resources/**")
                    .notMatch(pathPrefix + "/webjars/**")
                    // 如果不带 context-path 也能访问（兼容性处理）
                    .notMatch("/swagger-ui/**")
                    .notMatch("/swagger-ui.html")
                    .notMatch("/v3/api-docs/**")
                    .notMatch("/swagger-resources/**")
                    .notMatch("/webjars/**")
                    // 进行登录校验
                    .check(r -> StpUtil.checkLogin());
        })).addPathPatterns("/**");
    }

}

